package cn.myfirefly.moming.house.service;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import cn.myfirefly.moming.house.dao.SpfTradeContractDao;
import cn.myfirefly.moming.house.dao.SpfTradePerformanceDao;
import cn.myfirefly.moming.house.entity.SpfTradeContract;
import cn.myfirefly.moming.house.entity.SpfTradePerformance;
import cn.myfirefly.moming.house.model.SpfTradeContractDetailDto;
import cn.myfirefly.moming.house.model.SpfTradeContractDto;
import cn.myfirefly.moming.house.model.SpfTradeContractFilterDto;
import cn.myfirefly.core.Const;
import cn.myfirefly.core.model.PageResultDto;
import cn.myfirefly.utils.BeanUtil;
import cn.myfirefly.utils.StrUtil;

@Service
@Transactional
public class SpfTradeContractService {

	@Autowired
	private SpfTradeContractDao spfTradeContractDao;
	
	@Autowired
	private SpfTradePerformanceDao spfTradePerformanceDao;
	
	public PageResultDto<SpfTradeContractDto> getList(SpfTradeContractFilterDto dto) {
		
		return spfTradeContractDao.getList(dto);
	}
	
	public PageResultDto<SpfTradeContractDto> getCommissionList(SpfTradeContractFilterDto dto) {
		
		return spfTradeContractDao.getCommissionList(dto);
	}
	
	public List<SpfTradeContractDto> getCommissionAllList(SpfTradeContractFilterDto dto) {
		
		return spfTradeContractDao.getCommissionAllList(dto);
	}
	
//	public PageResultDto getList(SpfTradeContractDto dto) {
//		
//		return spfTradeContractDao.getList(dto);
//	}

	public SpfTradeContractDto getSpfTradeContract(Integer id) {
		SpfTradeContract spfTradeContract = spfTradeContractDao.get(id);
		SpfTradeContractDto spfTradeContractDto = BeanUtil.copyBeans(SpfTradeContractDto.class, spfTradeContract);
		return spfTradeContractDto;
	}
	
	public BigDecimal getTotalAmt(SpfTradeContractFilterDto dto) {
		return spfTradeContractDao.getTotalAmt(dto);
	}
	
	public Map<String, BigDecimal> getTotalCommission(SpfTradeContractFilterDto dto) {
		return spfTradeContractDao.getTotalCommission(dto);
	}
	
	public String del(Integer id) {
		SpfTradeContract spfTradeContract = spfTradeContractDao.get(id);
		if (spfTradeContract == null) {
			return "该信息不存在，请尝试刷新列表后再操作。";
		}
		spfTradeContractDao.del(spfTradeContract);
		return Const.ResultCode.SUCCESS;
	}
	
	public String cancel(Integer id) {
		SpfTradeContract spfTradeContract = spfTradeContractDao.get(id);
		if (spfTradeContract == null) {
			return "该信息不存在，请尝试刷新列表后再操作。";
		}
		spfTradeContract.setTradeContractStatus("6");
		spfTradeContractDao.save(spfTradeContract);
		return Const.ResultCode.SUCCESS;
	}
	
	public String finish(Integer id) {
		SpfTradeContract spfTradeContract = spfTradeContractDao.get(id);
		if (spfTradeContract == null) {
			return "该信息不存在，请尝试刷新列表后再操作。";
		}
		spfTradeContract.setTradeContractStatus("5");
		spfTradeContractDao.save(spfTradeContract);
		return Const.ResultCode.SUCCESS;
	}
	
	public Integer insert(SpfTradeContractDto dto) {
		SpfTradeContract spfTradeContract = BeanUtil.copyBeans(SpfTradeContract.class, dto);
		return spfTradeContractDao.save(spfTradeContract);
	}
	
	public Integer update(SpfTradeContractDto dto) {
		SpfTradeContract spfTradeContract = spfTradeContractDao.get(dto.getId());
		if (spfTradeContract == null) {
			return -1;
		}
		
		if (StrUtil.equals(spfTradeContract.getTradeContractStatus(), "5") ||
				StrUtil.equals(spfTradeContract.getTradeContractStatus(), "6")) {
			return -2;
		}
		
		BeanUtil.copyBeans(dto, spfTradeContract);
		int count = spfTradeContractDao.save(spfTradeContract);
		
		SpfTradePerformance spfTradePerformance = spfTradePerformanceDao.getByContractId(spfTradeContract.getId());
		if (spfTradePerformance != null) {
			BigDecimal oldNewAmount = new BigDecimal("3000");
			BigDecimal performanceAmount = spfTradeContract.getReceivableCommission().
					multiply(new BigDecimal("0.9")).subtract(oldNewAmount).setScale(2, RoundingMode.HALF_UP);
			spfTradePerformance.setPerformanceAmount(performanceAmount);
			spfTradePerformance.setModifyBy(dto.getModifyBy());
			spfTradePerformance.setModifyDate(dto.getModifyDate());
			spfTradePerformanceDao.save(spfTradePerformance);
		}
		return count;
	}
	
	public SpfTradeContractDetailDto getContractDetail(Integer id) {
		return spfTradeContractDao.getContractDetail(id);
	}
}
